package gulimall.controller;

import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;
import java.util.UUID;

/**
 * @author HLF
 * @date 2022/8/6 11:39
 */
@Controller
public class AuthController {

    @Resource
    private StringRedisTemplate stringRedisTemplate;


    /**
     * 返回获取登录后的用户信息
     * 根据token来查询真正对应的用户信息
     * @return
     */
    @ResponseBody
    @GetMapping("/userInfo")
    public String userInfo(@RequestParam("token") String token){
        //去redis查询token对应的信息
        String s = stringRedisTemplate.opsForValue().get(token);
        return s;
    }

    /**
     * 跳转到登录页
     */
    @GetMapping("/login.html")
    public String loginPage(@RequestParam("redirect_url") String redirectUrl,
                            Model model,
                            @CookieValue("sso_token") String token) {

        //如果能获取到cookie，就说明之前已经有客户端浏览器登录过了还给浏览器留下了痕迹.那么就可以不用再登录了
        if (StringUtils.hasText(token)) {
            //就直接可以跳到受保护的资源页面
            return "redirect:" + redirectUrl + "?token=" + token;
        }

        model.addAttribute("url", redirectUrl);
        return "login";
    }

    @PostMapping("/login")
    public String login(String username, String password, String redirectUrl, HttpServletResponse response) {
        if (StringUtils.hasText(username) && StringUtils.hasText(password)) {
            //1.登录成功，将用户信息保存到redis中
            String uuid = UUID.randomUUID().toString().replace("-", "");
            stringRedisTemplate.opsForValue().set(uuid, username);//这里只是简单的将用户名放入redis，真是场景下可以序列化存储对象

            //2.将token保存到Cookie中
            //这个cookie的有效期就是当前会话，浏览器一关，那么认证服务器对应的cookie就没有了
            Cookie sso_token = new Cookie("sso_token", uuid);
            //只要有客户端登录成功就留一个cookie
            response.addCookie(sso_token);

            return "redirect:" + redirectUrl + "?token=" + uuid;
        } else {
            return "login";
        }
    }
}
